﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Transactions;

namespace SWGeneracionE.Models.Repositories
{
    public class ParticipanteXEventoRepository : GenericRepository<GEEntities, ParticipanteXEvento>
    {

        public ParticipanteXEventoRepository(GEEntities context)
            : base(context)
        {

        }

        public ParticipanteXEvento AddCodigo(ParticipanteXEvento participante, int idPais, string abvPais, int padCodigo)
        {
            //se utiliza una transaccion para validar que el código genrado sea único
            var options = new TransactionOptions { IsolationLevel = IsolationLevel.Serializable, Timeout = new TimeSpan(0, 0, 0, 10) };
            using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, options))
            {
                //se obtiene el código del participante -> abreviatura de pais + numero de participante por pais (GUA001)
                int sigCodigo = GetCountParticipanteXPais(idPais) + 1;
                string codigoParticipante = abvPais + sigCodigo.ToString().PadLeft(padCodigo, '0');
                participante.codigo = codigoParticipante;
                //se agrega el participante
                var addedParticipante = Add(participante);

                Context.SaveChanges();
                scope.Complete();

                return addedParticipante;
            }
        }

        private int GetCountParticipanteXPais(int idPais)
        {
            string sSQL = "SELECT count(*) FROM ParticipanteXEvento PE (UPDLOCK)" + 
                          " INNER JOIN Participante P ON (PE.idParticipante = P.idParticipante)" +
                          " WHERE P.idPais = " + idPais.ToString();

            return Context.Database.SqlQuery<int>(sSQL).SingleOrDefault();
        }
    }
}